package cn.gok.mmall.controller.protal;

import cn.gok.mmall.common.Const;
import cn.gok.mmall.common.ServerResponse;
import cn.gok.mmall.pojo.User;
import cn.gok.mmall.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.util.Date;

/**
 * @Author: chenfan
 * @Description:    前台系统用户控制层
 *
 * @RestController ： 该注解为一个组合注解（@Controller + @ReponseBody），
 *                      添加了该注解以后，当前控制层的所有方法都默认返回json数据
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private IUserService userService;

    /**
     * 登录方法
     *  @PostMapping 只有被post请求调用
     */
    @PostMapping("/login.do")
    public ServerResponse login(String username, String password, HttpSession session){
        User user = userService.login(username, password);
        if (user != null){
            session.setAttribute(Const.CURRENT_USER,user);
            return ServerResponse.success("登录成功");
        }
        return ServerResponse.error("登录失败");
    }


    @PostMapping("/register.do")
    public ServerResponse register(User user){
        user.setCreateTime(new Date());
        user.setUpdateTime(new Date());
        user.setRole(Const.ROLE_CUSTOMER);

        ServerResponse serverResponse = userService.addUser(user);
        return serverResponse;
    }


    /**
     * 注册的时候，自动调用该方法进行 用户名或者邮箱的验证
     * @param str  可能为用户名的值 或 邮箱的值
     * @param type  值为：username和email ，表示进行用户名验证或邮箱验证
     */
    @PostMapping("/check_valid.do")
    public ServerResponse checkValid(String str,String type){
        return userService.checkValid(str, type);
    }

    /**
     * 通过问题的方式找回密码的思路：
     *      1、来到问题页面（需要输入用户名或邮箱）， 在问题页面展示出问题
     *
     *      2、 在问题页面进行问题的回答，并提交（提交用户名 + 问题 + 问题答案）， 如果判断答案是正确的，
     *          此时会在服务端生成一串不重复的字符串，作为该用户修改的密码的依据（token），
     *          此字符串会在服务端保存一份，
     *          也会发送一份到客户端（主要是发送到修改密码的页面）
     *
     *      3、用户修改密码页填写新密码，点击提交（此时会带上token）
     *          我们用服务端token 和 提交的token对比，如果比较成功，则修改密码
     *          不成功，则提示token过期，重写填写问题答案。
     */

    @GetMapping("/forget_get_question.do")
    public ServerResponse getQuestion(String username){
        return userService.getQuestion(username);
    }


    @PostMapping("/forget_check_answer.do")
    public ServerResponse checkAnswer(String username,String question,String answer){
        return userService.checkAnswer(username, question, answer);
    }

    @PostMapping ("/forget_reset_password.do")
        public ServerResponse resetPassword(String username,String forgetToken,String passwordNew){
        return userService.updatePasswordByUsername(username,passwordNew,forgetToken);
    }

}
